//
//  main.m
//  OC_08_类的扩展
//
//  Created by wyx on 16/3/7.
//  Copyright © 2016年 Apon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Address.h"
#import "Contact.h"
#import "NSString+AddMethods.h"
#import "Girl.h"
#import "Boy.h"
#pragma mark - category
/** 知识点: category (类目,或分类)
 *  作用1 对没有源码(没有.m 文件)的类扩展功能
 *  只能添加方法不能添加实例变量
 *  作用2 编写类文件时,吧种多方法进行分类
 */
void chapterOfCategory() {
    //详见 NSString+AddMethods 类文件
    [NSString sayHi];
    //为NSString类扩展一个新的方法，要求获取字符串的首字母并且将该首字母大写。
    //类调用
    NSString *mStr = [NSString getFirstMix:@"wyx"];
    NSLog(@"%@",mStr);
    //对象调用
    NSString *mStr1 = [@"wyx" getFirst];
    NSLog(@"%@",mStr1);
}
#pragma mark - extension
/** 知识点: extension. 延展 */
void chapterOfExtension() {
    //详见通讯录类
    Address *ab = [[Address alloc] init];
    Contact *con1 = [[Contact alloc] init];
    con1.name = @"Tom";
    con1.phoneNumber = @"1334229395";
    [ab addContact:con1];
    //ab.mDic = [NSMutableDictionary dictionary];
}
#pragma mark - protocol, delegate
/** 知识点: protocol, delegate. */
void chapterOfProtocelDelegate() {
    /** 详见 Girl和 Boy 类
     *  Girl 类声明协议方法(只声明不实现),boy 对象实现协议方法
     *  Girl 类在适当的时候让代理人自己调用方法
     
     总结
     *  delegate设计模式 分6 步
     *  1 girl 声明协议方法
     *  2 girl 声明一个 delegate 属性(通常用 assign)
     *  3 girl 在适当的时机(适当的方法中),让 delegate 执行协议方法
     *  4 boy 签订协议
     *  5 girl 指定 delegate(boy 对象)
     *  6 boy 实现协议方法
     */
    Girl *girl = [[Girl alloc] init];
    girl.name = @"小梅";
    Boy *boy = [[Boy alloc] init];
    boy.name = @"小强";
    //girl 指定代理人
    girl.delegate = boy;
    [girl marry];
    
}

/** 限时代码. */
void limitTimeCoded() {
    
    
}

/** 阅读资料. */
void resource() {
    
    
}
int main(int argc, const char * argv[]) {
#pragma mark - 知识点1: Category (类目)
    //chapterOfCategory();
    
#pragma mark - 知识点2: Extension (延展)
    //chapterOfExtension();
    
#pragma mark - 知识点3: Protocol , delegate
    chapterOfProtocelDelegate();
    
#pragma mark - 限时代码.
    limitTimeCoded();
    
#pragma mark - 阅读资料.
    resource();
    return 0;
}
